//LCD1620——I/O模拟控制方式
#Include <reg52.h>
#Include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^0; //寄存器选择信号,高表示数据、低表示指令
sbit rw = P2^1; //读写控制信号,高表示读、低表示写
sbit ep = P2^2;//片选使能信号。下降沿触发
BYTE code dis1[] = {"abcdef"};//每行zui多显示16个字符
BYTE code dis2[] = {"ABCDEF"};
delay(BYTE ms)// 延时子程序
{
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()// 测试LCD忙碌状态 011
{
BOOL result;
rs = 0;//指令
rw = 1;//读
ep = 1;//使能
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);//读忙标志和地址计数器ACC的值
//P0口如果等于0X80,则说明不忙碌,(数据总线的高位为1)
ep = 0;//使能下降沿触发
return result;
}
lcd_wcmd(BYTE cmd)// 写入指令数据到LCD 000
{
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;//下降沿
_nop_();
_nop_();
P0 = cmd;//写指令数据,已经定义“ BYTE cmd”
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1; //高
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0; //低
}
lcd_pos(BYTE pos)//设定显示位置
{
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)//写入字符显示数据到LCD 100
{
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;//写数据数据,已经定义“BYTE dat”
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1; //高
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0; //低
}
lcd_init() //LCD初始化设定
{
lcd_wcmd(0x38); //打开显示开关、允许移动位置、允许功能设置
delay(1);
lcd_wcmd(0x0c); //打开显示开关、设置输入方式
delay(1);
lcd_wcmd(0x06); //设置输入方式、光标返回
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
main()
{
BYTE i;
lcd_init(); // 初始化LCD
delay(10);
lcd_pos(0); // 设置显示位置为*行的第5个字符
i = 0;
while(dis1[i] != '0')
{ // 显示字符"abcdef"
lcd_wdat(dis1[i]);
i++;
}
//lcd_pos(0x41); // 设置显示位置为第二行第二个字符
lcd_pos(64); // 设置显示位置为第二行第1个字符
i = 0;
while(dis2[i] != '0')
{
lcd_wdat(dis2[i]); // 显示字符"ABCDEF "
i++;
}
while(1); //
}
//LCD12864—I/O模拟控制显示方式
/********************************************/
/* 12864系列测试程序 */
//128*64--16行*8页*64列
/********************************************/
#Include <reg51.h>
#Include <ctype.h>
#Include <string.h>
#Include <stdlib.h>
#Include <stdio.h>
#Include <math.h>
#define Disp_On 0x3f//显示开0011 111X 显示开/关指令
#define Disp_Off 0x3e//显示关0011 111X 显示开/关指令
#define Col_Add 0x40//设置列地址01XX XXXX(0-63列)
#define Page_Add 0xb8 //设置页地址指令1011 1XXX(0-7页)、页(PAGE)设置指令
#define Start_Line 0xc0//起始行11XX XXXX(0-63行)显示起始行(ROW)设置指令
#define Lcd_Bus P0 //总线接口 MCU P1<------> LCM
sbit Mcs=P2^6; //主芯片选中(使能 Master chip enable)
sbit Scs=P2^5; //从芯片选中(使能 Slave chip enable)
sbit Enable=P2^7; //LCD信号使能 6800 mode Enable single
sbit Di=P2^4; //数据、命令选择端 Data or Instrument Select
sbit RW=P2^3; //读写控制端 Write or Read
sbit Lcd_Rst=P1^0; //Lcm reset
/*
#Include<absacc.h>
#define LCD_CMD_WRA XBYTE[0x8008] //;写指令代码,RS=0、R/W=0
#define LCD_DATA_WRA XBYTE[0x8009] //;写数据,RS=1、R/W=0
#define LCD_BUSY_RDA XBYTE[0x800A] //;读忙标志和AC值,RS=0、R/W=1
#define LCD_DATA_RDA XBYTE[0x800B] //;读数据,RS=1、R/W=1
#define LCD_CMD_WRB XBYTE[0x8004] //;写指令代码,RS=0、R/W=0
#define LCD_DATA_WRB XBYTE[0x8005] //;写数据,RS=1、R/W=0
#define LCD_BUSY_RDB XBYTE[0x8006] //;读忙标志和AC值,RS=0、R/W=1
#define LCD_DATA_RDB XBYTE[0x8007] //;读数据,RS=1、R/W=1
*/
char code ce[]={
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00
};
char code shi[]={
/*-- 文字: 试 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00
};
char code kai[]={
/*-- 文字: 开 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00
};
char code shi3[]={
/*-- 文字: 始 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x90,0x70,0x1F,0x12,0xF0,0x00,0x20,0x70,0x28,0x27,0x22,0x28,0x70,0x20,0x00,
0x40,0x21,0x12,0x0C,0x06,0x09,0x30,0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00
};
char code wan[]={
/*-- 文字: 完 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x90,0x8C,0xA4,0xA4,0xA4,0xA5,0xA6,0xA4,0xA4,0xA4,0xA4,0x94,0x8C,0x04,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x70,0x00,0x00
};
char code bi[]={
/*-- 文字: 毕 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFF,0x88,0x48,0x28,0x08,0x80,0x7F,0x88,0x88,0x88,0x84,0x84,0xE0,0x00,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00
};
//-----------------延时子程序-----------------------------
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
//----------------写命令到LCD------------------------------
void write_com(unsigned char cmdcode)//RS=0、RW=0、E=“1—》0”
{
Di=0;
RW=0;
Lcd_Bus=cmdcode;
delay(0);
Enable=1;
delay(0);
Enable=0;
}
//------------------写数据到LCD----------------------------
void write_data(unsigned char Dispdata)//RS=1、RW=0、E=“1—》0”
{
Di=1;
RW=0;
Lcd_Bus=Dispdata;
delay(0);
Enable=1;
delay(0);
Enable=0;
}
//------------------读LCD数据----------------------------
unsigned char read_data()//RS=1、RW=1、E=1
{
unsigned char tmpin;
Di=1;
RW=1;
delay(0);
Enable=1;
delay(0);
Enable=0;
tmpin=Lcd_Bus;
return tmpin;
}
//-----------------清除内存---------------
void Clr_Scr()
{
unsigned char j,k;
Mcs=1;Scs=1;
write_com(Page_Add+0);
write_com(Col_Add+0);
for(k=0;k<8;k++)//8页
{
write_com(Page_Add+k);//0-8
for(j=0;j<64;j++)//64列
write_data(0x00);
}
}
//--------------------指定位置显示汉字16*16-----------------------
void hz_disp16(unsigned char pag,unsigned char col, unsigned char code *hzk)
{
unsigned char j=0,i=0;
for(j=0;j<2;j++)
{
write_com(Page_Add+pag+j);
write_com(Col_Add+col);
for(i=0;i<16;i++) write_data(hzk[16*j+i]);
}
}
//-----------------初始化LCD屏--------------------------
void init_lcd()
{
Lcd_Rst=0;delay(100);
Lcd_Rst=1;delay(100);
Mcs=1;Scs=1;delay(100);
write_com(Disp_Off);
write_com(Page_Add+0);
write_com(Start_Line+0);
write_com(Col_Add+0);
write_com(Disp_On);
}
//---------------------------信息显示---------------------
void Msg(int flg)
{
Clr_Scr();
if(flg==0)//显示“测试开始”
{
Mcs=1;Scs=0;
hz_disp16(3,32,ce);delay(2000);
hz_disp16(3,48,shi);delay(2000);
Mcs=0;Scs=1;
hz_disp16(3,0,kai);delay(2000);
hz_disp16(3,16,shi3);delay(2000);
}
else if(flg==1)//显示“测试完毕”
{
Mcs=1;Scs=0;
hz_disp16(3,32,ce);
hz_disp16(3,48,shi);
Mcs=0;Scs=1;
hz_disp16(3,0,wan);
hz_disp16(3,16,bi);
}
}
//-------------------主程序--------------------------------
main()
{
unsigned char i=0;
init_lcd();
while(1)
{
Msg(0);delay(10000);
Msg(1);delay(10000);
}
}